package controller

import (
	"errors"
	"strconv"

	"douyin/models"
	"douyin/repository/mysql"
	"douyin/service"
	"douyin/utils/pack"

	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

// Register 用户注册
func Register(c *gin.Context) {
	// 1. 获取querystring参数和参数校验
	p := new(models.UserRequest)
	if err := c.ShouldBind(&p); err != nil {
		// 请求参数有误，直接返回响应
		zap.L().Error("controller.Register with invalid param", zap.Error(err))
		models.ResponseUserError(c, models.CodeInvalidParam)
		return
	}
	// 2. 业务处理
	userId, token, err := service.Register(p)
	if err != nil {
		zap.L().Error("service.Register failed", zap.Error(err))
		if errors.Is(err, mysql.ErrorUserExist) {
			models.ResponseUserError(c, models.CodeUserExist)
			return
		}
		models.ResponseUserError(c, models.CodeServerBusy)
		return
	}
	// 3. 返回响应
	models.ResponseUserSuccess(c, userId, token)
}

// Login 用户登录
func Login(c *gin.Context) {
	// 1. 获取querystring参数和参数校验
	p := new(models.UserRequest)
	if err := c.ShouldBind(&p); err != nil {
		// 请求参数有误，直接返回响应
		zap.L().Error("controller.Login with invalid param", zap.Error(err))
		models.ResponseUserError(c, models.CodeInvalidParam)
		return
	}
	// 2. 业务处理
	userId, token, err := service.Login(p)
	if err != nil {
		zap.L().Error("service.Login failed", zap.Error(err))
		if errors.Is(err, mysql.ErrorUserNotExist) {
			models.ResponseUserError(c, models.CodeUserNotExist)
			return
		}
		models.ResponseUserError(c, models.CodeInvalidPassword)
		return
	}
	// 3. 返回响应
	models.ResponseUserSuccess(c, userId, token)
}

// UserInfo 用户信息
func UserInfo(c *gin.Context) {
	userId, _ := c.Get(pack.CtxUserIDKey)                      //自己id
	otherId, _ := strconv.ParseInt(c.Query("user_id"), 10, 64) //对方用户id
	// 2. 业务处理
	user, err := service.UserInfo(userId.(int64), otherId)
	if err != nil {
		zap.L().Error("service.UserInfo failed", zap.Error(err))
		if errors.Is(err, mysql.ErrorInvalidID) {
			models.ResponseUserInfoError(c, models.CodeUserNotExist)
			return
		}
		models.ResponseUserInfoError(c, models.CodeServerBusy)
		return
	}
	// 3. 返回响应
	models.ResponseUserInfoSuccess(c, user)
}
